/**
 * Cesium功能扩展库
 * 提供基于Cesium的地图功能扩展，支持自定义几何体、控件、工具函数等
 * @module CesiumExtensions
 */

/**
 * Cesium核心库
 * 提供Cesium的所有功能和API
 * @external Cesium
 * @see {@link https://cesium.com/learn/cesiumjs/ref-doc/index.html Cesium官方文档}
 */

import * as Cesium from "cesium";

// 导入CSS样式（通过统一入口导入所有CSS文件）
import "./css/index.js";
// 导入各个模块
import ControlModule from "./control/index.js";
import LayerModule from "./layer/index.js";
import MapModule from "./map/index.js";
import ProjectionModule from "./projection/index.js";
import ToolModule from "./tool/index.js";
import TypeModule from "./type/index.js";
import UtilModule from "./util/index.js";
import ViewerModule from "./viewer/index.js";
import GraphicModule from "./graphic/index.js";
import { version } from "./viewer/viewerOptions.js";


/**
 * 为Cesium Viewer实例添加CesiumExtensions命名空间
 * @param {external:Cesium.Viewer} viewer - Cesium Viewer实例
 * @returns {external:Cesium.Viewer} 增强后的Viewer实例
 * @example
 * const viewer = new Cesium.Viewer('cesiumContainer');
 * CesiumExtensions.extend(viewer);
 * // 现在可以通过viewer.CesiumExtensions访问扩展功能
 * viewer.CesiumExtensions.control.ControlBase();
 */
function extendViewer(viewer) {
  if (!viewer.CesiumExtensions) {
    // 使用临时对象，稍后会被替换为最终的CesiumExtensions导出对象
    viewer.CesiumExtensions = tempCesiumExtensions;
    console.log("CesiumExtensions initialized");
  }
  return viewer;
}

// 定义一个临时对象用于extendViewer函数使用
const tempCesiumExtensions = {
  /**
   * 扩展库版本号
   * @type {string}
   */
  version,

  /**
   * Cesium核心库引用
   * @type {Object}
   * @see external:Cesium
   */
  Cesium,

  /**
   * 为Viewer添加命名空间扩展
   * @type {Function}
   */
  extend: extendViewer,

  /**
   * 控件模块
   * @type {Object}
   * @see module:CesiumExtensions/control
   */
  control: ControlModule,

  /**
   * 图层模块
   * @type {Object}
   * @see module:CesiumExtensions/layer
   */
  layer: LayerModule,

  /**
   * 图元模块
   * @type {Object}
   * @see module:CesiumExtensions/graphic
   */
  graphic: GraphicModule,

  /**
   * 地图模块
   * @type {Object}
   * @see module:CesiumExtensions/map
   */
  map: MapModule,

  /**
   * 投影模块
   * @type {Object}
   * @see module:CesiumExtensions/projection
   */
  projection: ProjectionModule,

  /**
   * 工具模块
   * @type {Object}
   * @see module:CesiumExtensions/tool
   */
  tool: ToolModule,

  /**
   * 类型定义模块
   * @type {Object}
   * @see module:CesiumExtensions/type
   */
  type: TypeModule,

  /**
   * 工具函数模块
   * @type {Object}
   * @see module:CesiumExtensions/util
   */
  util: UtilModule,

  /**
   * Viewer模块
   * @type {Object}
   * @see module:CesiumExtensions/viewer
   */
  viewer: ViewerModule,
};

// 导出Cesium核心库
export { Cesium };

// 导出extend方法作为命名导出
export const extend = extendViewer;

// 导出各个模块作为命名导出
export const control = ControlModule;
export const layer = LayerModule;
export const map = MapModule;
export const projection = ProjectionModule;
export const tool = ToolModule;
export const type = TypeModule;
export const util = UtilModule;
export const viewer = ViewerModule;
export const graphic = GraphicModule;

// 导出版本号
export { version };

// 修复extendViewer函数中引用的对象，确保使用最终的导出对象
extendViewer.prototype._updateCesiumExtensionsReference = function () {
  if (this.CesiumExtensions && this.CesiumExtensions === tempCesiumExtensions) {
    // 由于我们使用的是tempCesiumExtensions，这里保持引用不变
    // this.CesiumExtensions = tempCesiumExtensions;
    console.log(
      "CesiumExtensions reference is already using the correct object"
    );
  }
};
